FORTH 資料庫程式設計
-------本文節錄 江明鑑先生 編著之 FORTH 入門,是 FIG-FORTH
版本,若要在 F-PC 上執行要修改成循序擋------------
金城 註疏:
一般人對資料庫的設計有幾個嚴重的誤解:
第一點:認為某一個套裝軟體就是資料庫,所以學資料庫就變成了學
DBASE Ⅳ、FoxBASE 或 Clipper 真是荒謬到了極點。就似學電腦與學
BASIC 之間一樣的誤解。別忘了資料庫的難以設計,是在於對整體資
料的分析、各類表格的設定、資料字典的整理、與對人機界面的整體
規劃。尤其是關聯式的資料庫(RELATIONAL DATABASE)本身就是一套精
準的數學模式。決不是用了幾年 DBASE 或 CLIPPER 的老鳥或阿貓阿
狗就能心神體會的。那是需要下功夫花時間在資料庫本身的研究上才
能有所成就的。否則就成了自欺欺人的騙吃騙喝了。
第二點:認為選對了一套工具軟體,就成功了一半。再找到了一位有數
年經驗的程式設計師,那又成功了另一半。天啊! 你可曾聽人說:
「選某一品牌的水泥,再找一個有數年經驗泥水匠,就可以蓋大樓
造大廈了」。如果此句話是錯的,那錯在那兒? 缺少了一位合格有
能力的建築師來規劃、來設計、來評估、來監督。大家都忘了,泥
水匠的工作是依圖施工。如果沒有圖,那就無法依循,成了「亂作
」了,所以資料庫的成敗關鍵人物是資料管理師,而不是程式設計
師啊。
第三點:最為可笑,許多人用來評估資料庫好壞的標準竟是:「CLIPPER
所寫的資料庫,比用 DBASE 寫的較好」「用甲牌的水泥所蓋的房子
,一定比用乙牌的水泥所蓋的房子要更美麗,更舒適」,我想這兩
個句子犯了同一個錯誤! 是不是? 工具只是增加方便性,除此之外
就無關緊要了。所有的套裝工具本質上是大同小異的,就似所有的
語言在功能之雖有差異,但在本質上都要轉成機械碼才能讓 CPU 執
行一樣。要評估一個資料庫的好壞,與評比一群資料庫發展工具的
優劣是兩碼事。評估資料庫,要點是在整體架構是否完整,例外的
處理、與資料庫的一致性是否顧及、其人機的使用者界面是否友善
易用....等。不是嗎?
這些年來資料庫的設計和應用是電腦最主要的用途,FORTH 是發展各型實用
資料庫最理想的語言,比其他高階或低階語言都有許多優點,它滿足了交談性及
提供程式自我說明等特性,所以適合於發展新的程式系統。用 FORTH 寫作商用
資料庫之迅速及便利,值得我們花一些時間去學習這種奇特的語言。
我曾用 FORTH 寫了一些小型的資料庫,包括 8000 個記錄(Records)每個記
錄有 128個字元(byte),這些不同用處的資料庫,加上它們特殊的輸入輸出程式
,通常只花我幾小時或一個晚上的時間便建成功了,我以前也用過其他語言來做
類似的工作,但用過 FORTH 以後,我是絕對不會再回去用那些語言了。
本文將討論一組 FORTH 的指令集,可以作為一個資料庫的基礎,我並加進
一個簡單的例子用這些指令來建造一個小型資料庫。這個指令集原來是
Bill Ragsdale (FORTH Interest Group 的創始人)在他們一次討論會上提出的
。我們將他的指令集稍加增益,將其擴大而可以來建立各式記帳用的資料庫。我
希望讀者對 FIG-RORTH 的語言模式及它的基本指令集已稍有涉獵,這對本文的
研讀有很大的幫助。
這個資料庫的指令都顯示在本文後。一共有八幕的程式,每一幕有 1024 字
元,分為 64 字一行,每幕有 16 行,第 21 幕是一些使用的指示文字。正式的
程式是由 22 幕到 28 幕為止。
在第 22 及 23 幕中有八個基本的指令,構成資料庫指令集的基礎,每個指
令的名稱以及在括弧中的註解,應可相當清楚地說明各個指令的功能,最先的兩
個指令是資料庫中須要用的兩個變數 :REC# 儲存現在處理的記錄的號碼,OPEN
則含有現在處理的檔案的起始位置。
2@ 及 D@ 是相同的指令,它們的功用是由堆疊最上存的地址處,抓出一個
32 位元的雙整數(Double Integer),再將此雙整數堆上堆疊。LAYOUT則是將新
開檔案的兩個主要參數堆上堆疊以供後續指令使用。READ 是我們將常常用的指
令,它將記錄號碼自堆疊上取出,檢查它是否在檔案的記錄範圍中,再將之存入
REC# 而把這個記錄做為現在要處理的記錄,RECORD 則由堆疊上將記錄號碼取
出而將這個記錄在記憶中的地址放置在堆疊上,最後,ADDRESS 則將存在 REC#
中的記錄號碼取出,再用 RECORD 找出這個記錄在記憶中的地址,還置於堆疊之
上。
金城 註疏:
如果使用 F-PC 或 32位元的 FORTH 系統,則 2@、D@、D*、D/、D/MOD
等雙倍精密度整數的詞可以不用再定義了。因為 F-PC 已經有了,而
32位元的 FORTH 則用不著了,因為整個系統都是以 32位元來定義的,
其 @、!、+、-、*、/MOD 均是32位元的。另外在傳統的 FORTH 中由於
磁碟機的存取是 FORTH 自己管的,所以為方便起見規劃成
1K(1024 Byte)大小的存取單位。無論程式或資料都是以 1K 為存取的
基本單位,但在 F-PC 中由於磁碟機是透過 DOS 來管理,所以改成了
循序檔案,而存取的單位便不再限定成 1K 的大小,可以由使用者自己
來定一筆資料錄的 Byte 數,使其更有彈性。但也喪失了 FORTH 傳統
中的 BLOCK 觀念,有利有弊。許多 FORTH 的老手仍喜歡 BLOCK 的觀
念,一來單純,二來有虛擬記憶體的優點。
第 23 幕上的三個指令叫做"定義指令"(Defining instruction)因為它們是
用來定義不同名稱的各種檔案以及在不同檔案中各個記錄欄(Field)的名稱。這
些定義指令使用 FORTH 中的特殊指令 <BUILDS 及 DOES> ,要了解這兩個特殊
指令的用法及功能是要花一些時間的,我們在此詳細地解釋一下24 幕上的三個
指令,或許可以幫助讀者來欣賞這兩個特殊指令的功能。
在一個記錄中有兩類記錄欄:一類是文字欄,另一類是數值資料欄,第 23
幕上第一個定義指令 DFIELD 是用來在記錄中加一個資料欄的,資料欄的長度
(位元單元)是取自堆疊的。DFIELD 給這個資料欄一個名字。當我們以後用這個
名字作為指令使用時,這個指令即會將在現用記錄 (其號碼存在 REC#中 )中這
一資料欄的地址還置在堆疊上,所以這個指令是用來指出這個資料欄在記憶中的
地址,以備我們由此欄中讀取資料或存入新資料。
TFIELD 則是用來在記錄中加一個文字欄的。這個文字欄的長度(字元單位)
也是取自堆疊上,文字欄的名字也是由 TFIELD 來定義的。當以後用文字欄的名
字作為指令用時,這個文字欄指令會將文字欄的地址以及文字欄的長度都堆上堆
疊。文字欄的長度是給 TYPE 這個指令來將文字欄中的文字印出來用的。因為資
料欄並不須要長度的資料,所以它和文字欄的性質有顯著的差異,故此我們須要
TFIELD 及 DFIELD兩個不同的定義指令來分別處理這兩類的記錄欄。
FILE 則是用來定義不同的檔案用的。FILE 由堆疊上取得其中各個記錄的總
長度(字元單位),檔案中記錄的總數,以及檔案在磁碟上的位置(塊數或BLOCK數)
。當以後我們用檔案的名字作為指令時,這個檔案的兩個主要參數的地址就會被
存到 OPEN 裡去,使得以後存取記錄時都由這個檔案中存取。
有了這兩幕上的這些指令,我們就可以來建造各種的檔案了。在此之前,我
要提醒讀者注意其使用的 FORTH 系統的一些特性。Fig-FORTH 的系統以 128 字
元為一個 BLOCK ,在這種系統中記錄的長度就不能超過 128 字元。最理想的記
錄長度是可以整除 128 的數字,如果我們定義的檔案記錄的長度是 70 字元,
這個檔案是可以操作,但每加一個記錄我們就浪費了58個字元,如果 BLOCK 的
長度是 1024 字元就比較理想了,只是我們表列的程式是為 128 字元的系統設
計並測試成功的。另外我們還須要一些輔助指令,例如一些雙整數的算術指令,
日期的換算,元、角、分數值的換算等這些指令是存在第 24 至 26 幕中的。
第 24 幕上的雙整數指令是用來幫助日期及錢幣換算等操作用的,它們只是
將 FIG -FORTH 系統的原有指令稍加延伸而成的,不須要詳細的解說。我們應注
意 D*、D/ 及 D/MOD 三個指令是單雙整數混合的操作,其順序須要分清。
第 25 幕上日期換算的指令是很簡單的,日期在記憶中是換算成一個整數存
放的,以後我有時間的時候我會再寫一個程式,把日期換算成為朱里安曆的日期
,這樣可以比較方便地計算日期的差異而可以準確地計算利息。目前的指令只是
將日期由 MM/DD/YY 的型式換成整數儲存(用?DATE 指令),並將內存日期以上述
的方式列印出來,( 用.DATE 指令)。這個方法的好處是每個日期在記憶中只佔
兩個字元或 16位元,?DATE 是一個用 WORD 及 NUMBER等基本指令來將輸入的日
期資料解碼成數目字的好例子。當使用者輸入 MM/DD/YY 的日期後,這個字串被
解為三個雙整數,堆在堆疊上。 DATEBIT 指令即將此三個雙整數減化為 16 位
元。.DATE 則將此 16 位元的數目還原成為字串日期列印出來。
第 26 幕是執行錢幣換算的一些指令。錢數在輸入後是轉換成 32 位元的雙
整數儲存的,在儲存前還要處理元角之間的小數點。在 FIG-FORTH 系統中,一
個數目字輸入時若帶了小數點就會被解碼成一個 32 位元的雙整數,小數點的位
置則存在 DPL 之中,利用 DPL 中存的位數,我們可以將得到雙整數移位而得到
正確的錢數,不管小數點的位置放在那裡。處理小數點是用一個 CASE 的結構來
完成的。
OSCALE 是處理沒有小數點的數字,這個數字應當乘以 100 且變為雙整數。
1SCALE 則應乘 10,2SCALE 則乘 1 就好了。假若小數點超過兩位,則輸入必有
錯誤,就應該印出警告字訊。在每種情形都有處理的指令後,我們就將其解碼欄
地址(Code fie ld Aadress 或 CFA )存在 NSCALE 變數的參數欄中。SCALE 則
是最後的指令,由 DPL 中找出小數點的位數而去 NSCALE 中找到合適的 CFA 去
執行錢數的換算。
?$AMOUNT 則是請使用人輸入錢數,換算成雙整數堆上堆疊的指令。
.$AMOUNT 則是將錢數列印出來的指令,印在八格的空欄中,右邊對齊。也許有
別的更好的方法來建立資料庫,但這幾幕上的指令是足夠我們用的了,這些指令
之能建立各式的資料庫可以充分地證實 FORTH 語言系統驚人的功能及可塑性。
有了這五幕的指令集,我們就可以很快地建立各種不同的檔案系統,每種檔
案都可隨客戶的需要而有不同的特性。在第 27 幕中的例子中,我在建立一個小
型檔案,其中每個記錄中有四欄:第一欄 TAG 有 2 字元:第二欄是文字欄,
NAME 有 30 字元長;第三欄是日期欄,2 字元;第四欄是金額欄,4 字元。這
個簡單的資料庫看來並沒有多大用處,但供給我們足夠的例子解釋資料庫的結構
及其輸入輸出法,最後在第 28 幕中還有一些附屬的指令用來清除記錄,輸入新
記錄及印出整個檔案的內容。
這個檔案的名稱是 DEMO ,其內各記錄的資料欄及文字欄的建立是先將一個
0 放在堆疊上,這是每個欄與記錄間頭的開端(以字元為單位)。第一欄叫做
TAG ,是資料欄,長度是 2 字元,這一欄是準備儲存一些檔案的系統資料的。
這一欄建好後,堆疊上的 0 即變為 2 ,就可以用來指示下一欄的起始地址。第
二欄是文字欄,名稱是 NAME ,長度是30 字元,在堆疊上留下 32 ( TAG 欄與
NAME 欄的總長度)。第三欄是 DAY ,是資料欄,長度是 2字元,因為日期是換
算成了一個 16 位元的數值,最後一欄叫 DOLLAR,也是資料欄,但是長度是 4
字元因為金額值是換算成 32 位元的雙整數的,整個記錄,即包括這四欄,記錄
的總長度是 38 字元留在堆疊上。
金城 註疏:
資料庫的基本概念是建立資料表格(TABLE)也就是俗稱的檔案(File)。
其中的每一列(ROW)稱之為記錄(Record),每一行(Column)稱之為欄位
(Field)。先將所有必需的資料,依其相關的程度,分置在各個獨立的
表格中。然後再加上對各種資料內容的搜尋(Search),更新(update),
建立(Append),和刪除(Delete)等基本功能。然後再製作一些顯示及列
表等高階的功能,當然最後以一友善的使用者介面將之整合成一體的應
用環境。便略俱雛形了。但是若要增加查詢的效率,則索引(INDEX),
雜湊(UASH)。 B-TREE 等高級技巧就必需要加入了。
下面我們就用 FILE 這個定義指令來建立 DEMO 檔案。FILE 除了須要記錄
的總長度(38字元)以外,還需要兩個參數。在檔案中記錄的總數(200),及檔案
開始的磁碟地址(400)。
32 200 400 FILE DEMO
即將 DEMO 檔案建成了。我們現在只要將所要用的記錄號碼存入 REC#中,
再呼叫 NAME ,DAY ,DOLLAR 等指令即可以將這個記錄相關各欄的地址叫到堆
疊上,有了這些地址我們便可以很方便地檢視其內容或更改其內容了。
在 FORTH 系統中" ! " 是存放數據資料的指令,而 "."是列印資料的指令
。遵循這個慣例,我們定義了一些檔案操作基本指令: !NAME 是將一個名字存
入 NAME 文字欄的指令,.NAME 則是將此欄文字列印出來的指令。 !DAY 將日期
存入 DAY 欄; .DAY 則將日期印出。 !DOLLAR 將金額存入 DOLLAR 欄而;
.DOLLAR則印出金額數值,這些即是全部資料庫所須的輸入及輸出指令了。
當我們將一些資料存入某一記錄中後,經常應該去檢查存進去的資料是否正
確。我們可以使用 FORTH 系統中的 DUMP 指令將整個記錄中的資料列印出來,
只要先用 READ 及 ADDRESS 將這個紀錄的開始地址找出來就好了,但是 DUMP
印出來的資料是每個字元的值不容易判讀其內容,因此我們另行定義一個。REC
的指令。 .REC 將整個記錄的內容用很整齊的方法印出來供使用者檢查,這個指
令可以加入許多花樣,使得列出的資料有不同的顯示方式或是列印在終端機的固
定位置上。這些花樣留待讀者自己去發展。
最後在第 28 幕上的是三個使用者所須要的三個指令 CLEAR.DATA 可以將整
個檔案清除以備輸入新資料; INPUT 則是用來由使用者輸入一個記錄的資料,
OUTPUT 則是將整個檔案中的資料全部列印出來。這三個指令即是使用者所必須
學會使用的,對使用人來說其他的系統都不必知道,因此學習使用這個系統是相
當方便的事。
CLEAR.DATA 並不清除檔案中的現存資料,它只是將第 0 個記錄清存。原因
是我使用第 0 個記錄儲存一些系統用的變數。在這個記錄的 TAG 欄中存的是檔
案裡最後一個記錄碼,表示檔案中記錄的總數。如果用 CLEAR.DATA 將這個記錄
清除為 0 ,TAG 中也是 0 表示檔案中沒有記錄。如果這時我們用 OUTPUT 來列
印,就會得到 "EMPTYFILE" 的訊息。如果我們開始用INPUT 加入新的記錄,這
個 TAG 欄中的數目會先加 1,加 1 後的數字也存入 REC# 中,這時就可以開始
輸入第一個記錄,以後類堆。
在 INPUT 的指令中,電腦會印出一些文字,指引使用者輸入正確的資料,
然後用 !NAME ,!DAY 及 !DOLLAR 等指令將輸入的資料存入現用的記錄中
UPDATE 及 FLUSH 兩指令則是在資料輸入後將記錄抄錄到磁碟上作長八的貯存。
當記錄輸入完畢時,並由 .REC 將輸入的資料按著設計的格式印出來備使用者檢
查其正確性。DUTPUT 則先取出第 0 號記錄 TAG 欄中的數目,然後再設定一個
DO-LOOP 將檔案中所有的記錄依次列印出來。
總之,這是一個很簡單的資料庫系統,但其中所採用的原理及方法,卻可以
隨使用者或客戶的須要而修正或擴充。我的目的乃是說明這個基本的 FORTH 指
令集的構成並解釋這些指令如何工作而達成其使命,其中有很多例子顯示在
FORTH 語言系統中各種型式的資料如文字資料及數值資料應該如何處理,這些討
論對有經驗的程式師而言可能是十分膚淺的,但對初學 FORTH 或是初次接觸到
資料庫的人,卻是很好的學習材料,我們希望這些讀者會覺得本文對他有所助益
,這個資料庫系統最大的好處,是它可以很方便地修正改變,以適合各人的特殊
需要所有的修改都是可以用互答式的操作來進行的,由此發展其他專門的資料庫
,不過是幾小時的工夫而已。
這套指令集是基於 FIG-FORTH 的指令集寫成的,其中有少數指令與
FORTH 的 79標準稍有出入,但要將它改變成為 79標準的指令也是很方便的事
,這個系統原來是在 Heathkit H89 微電腦上發展出來的,發展成功之後我又將
它轉建到 CP/M 的 FIG-FORTH 系統上,現在發表的就是這個 CP/M 上的程式,
使用 128BYTES/BLOCK 的貯存方式,如果讀者有 CP/M 的 FIG-FORTH 系統,只
要將原程式輸入即可操作了。
金城 註疏:
目前資料庫的發展隨著網路架構的成熟,近年來有了許多新的觀念,除
了傳統的線上交易處理(OLTP)系統外,還加上了主從式(Client/Server)
資料庫與分散式(Distributed)資料庫、物件導向(Object Oriented)資
料庫、多媒體(Multimedia)資料庫、與知識庫(Knowledge BASE)等的蓬
勃發展。而結構化詢問式語言(SQL)也有了國際標準。甚至 Microsoft
的新作業系統 Windows-NT,也在其中加上了 SQL 的部份,所以如果看
官對資料庫的應用真的感興趣,那可以多花點心思研究一下。請記住在
電腦的世界中沒有速食麵,只有紮下根基才是正途。
SCR # 21
0 ( SCREEN 21: CDMMENTS AND LOAD FOR DEMO DATA FILE )
1 27 EMIT 69 EMIT CR CR CR CR CR
2 ." This demonstration data system provides a pattern for the "
3 CR ." further development of any type of data base. The basic "
4 CR ." file formating definitions are on Screens 22 and 23. Some
5 CR ." utilities are on 24, 25, and 26. The demo file "
6 CR ." definitions are on 27. Elementary file maniqulation "
7 CR ." utilities are on 28. This model should get you started. "
8 ; PROCEDE CR CR ." ENTER 'Y' TO LOAD SCREENS " KEY 89 = IF
9 29 22 DO I LOAD LOOP ENDIF ;
10 PROCEDE
11 ;S
12
13
14
15
SCR # 22
0 CR ." SCREEN 22: FILE DEVELOPMENT "
1 0 VARIABLE REC# ( holds the current record numberm )
2 0 VARIABLE OPEN ( points to current file descriptor )
3
4 : 2@ DUP 2 + @ SWAP @ ; ( double fetch )
5
6 : LAYOUT ( leave bytes/record-2, and bytes/block-1 )
7 OPEN @ 4 + 2@ ;
8 : READ ( n-th record, on stack,is made current )
9 0 MAZ DUP OPEN @ 2 + @ < =
10 IF."FILE ERROR "QUIT THEN REC# ! ;
11 RECORD ( leave address of n-th record )
12 LAYOUT */MOD OPEN @ @ + BLOCK + ;
13 : ADDRESS ( leave address of the current record )
14 REC# @ RECORD ;
15 ; S
金城 註疏: 在 F-PC 中 2@ 以經有了。
SCR # 23
0 CR ." SCREEN 23: FILE DEVELOPMENT - 2 "
1 : TFIELD <BUILDS ( create a text field )
2 OVER, DUP, + ( leaves file count for this definition )
3 DOES> ( leaves: addr, count )
4 2@ ADDRESS + SWAP ;
5 : DFIELD <BUILDS ( create a data field )
6 OVER , + ( leaves file count for this definition )
7 DOES> ( leaves address )
8 @ ADDRESS + ;
9 : FILE ( create a named storage allocation )
10 <BUILDS ( origin block )
11 1+ , ( number of records in file )
12 DUP B/BUF OVER / * , ( #bytes per block )
13 , ( #bytes per record )
14 DOES> OPEN ! ; ( when file name used, point to )
15 ; S ( its decriptor parameters. )
MSG # 15
OK
金城 註疏: 在 Fig-FORTH 中的 <BUILDS 就是 F-PC 的 CREATE 。
SCR # 24
0 CR ." SCREEN 24: DOUBLE PRECISION ARITHMETIC "
1 : D/ (d, u -- d )
2 SWAP OVER /MOD >R SWAP U/ SWAP DORP R> ;
3 : D* ( d, u -- d )
4 DUP ROT * ROT ROT U* ROT + ;
5 : D/MOD ( d, u -- r, g ) U/ ;
6 : D@ ( ADDR -- D ) DUP 2 + @ SWAP @ ;
7 : D! ( d, addr -- ) DUP ROT SWAP ! 2 + ! ;
8 : DOUP ( d -- d, d ) 2DUP ;
9 : DSWAP ( dl, d2, -- d2, d1 ) ROT >R ROT R> ;
10 : DDROP ( d1, d2, -- ) DROP DROP ;
11 ; S
12
13
14
15
SCR # 25
0 CR ." SCREEN 25: DATE COMPRESSION AND EXPANSION "
1 : DATEBIT ( converts date inqut to 2 bytes )
2 32 D* D+ 13 D* D+ DROP ;
3 : ?DATE ." ( MM/DD/YY ) "
4 QUERY 47 WORD HERE NUMBER 47 WORD HERE NUMBER BL WORD
5 HERE NUMBER DATEBIT ;
6 : .DATE ( formats 2 byte date code and prints )
7 0 13 U/ 32 /MOD ROT 100 * ROT + 0 100 D* ROT 0 D+
8 <# # # 47 HOLD # # 47 HOLD # # #> TYPE ;
9 ;S
10
11
12
13
14
15
SCR # 26
0 CR ." SCPEEN 26: ?SAMOUNT AND .$AMOUNT "
1 ( define action for each scale case )
2 : 0scale 100 D* ; : 1SCALE 10 D* ; : 2SCALE ;
3 : 3SCALE ." INPUT ERROR " CR ;
4 ( define scale case and extend for each with 'CFA' )
5 ' 0SCALE CFA VARIABLE NSCALE ' 1SCALE CFA , 2SCALE CFA,
6 , 3 SCALE CFA ,
7 ( scale double precision value according to 'DPL' )
8 : SCALE DPL @ 3 MIN 2 * NSCALE + EXECUTE ;
9 ( wait for decimal value and scale it - leave value on stack )
10 : ?$AMOUNT QUERY BL WORD HERE NUMBER SCALE ;
11 ( print d from stack as $ and right justify in 8 spaces )
12 : .$AMOUNT
13 DUP ROT ROT DABS <# # # 46 HOLD #S SIGN #>
14 36 EMIT DUP 8 SWAP - SPACES TYPE ;
15 ;S
MSG # 15
OK
SCR # 27
0 CR ." SCREEN 27: DEMO FILE - RECORD GRNERATION "
1 0 2 DFIELD TAG ( a tag )
2 30 TFIELD NAME ( item name )
3 2 DFIELD DAY ( the date )
4 4 DFIELD DOLLAR ( a dollar amount )
5 200 ( number of records ) 400 (starting block )
6 FILE DEMO
7 : !NAME (wait for name then store it in record )
8 NAME DROP 30 32 FILL QUERY 1 TEXT PAD COUNT
9 NAME ROT MIN CMOVE UPDATE ;
10 : .NAME ( print name field ) NAME TYPE ;
11 ( the rest follow in the same way )
12 : !DAY ?DATE DAY ! UPDATE ; : .DAY DAY @ .DATE ;
13 : !DOLLAR ?$AMOUNT DOLLAR D! UPDATE ;
14 : .DOLLAR DOLLAR D@ .$AMOUNT ;
15 : .REC CR REC# @ 3 .R 2 SPACES .NAME .DAY 2 SPACES .DOLLAR ;
SCR # 28
0 CR ." SCREEN 28: DEMO FILE - CLEAR.DATA, INPUT OUTPUT "
1 ( clear especially tag in the 0 record in file )
2 : CLEAR.DATA 0 READ TAG 128 0 FILL UPDATE ;
3 ( example of formatting for inqut )
4 : INPUT 0 READ TAG @ 1 + UPDATE DUP TAG ! READ
5 CR CR ." ENTER NAME " !NAME
6 CR ." ENTER DATE " !DAY ( has a format prompt )
7 CR ." ENTER AMOUNT " !DOLLAR
8 .REC FLUSH ; ( save this record on disk )
9 ( list files 1 through the number in TAG of 0 record )
10 : OUTPUT 0 READ TAG @ DUP 0 = IF CR CR. " EMPTY FILE "
11 DROP ELSE 1 + 1 DO FORTH I READ .REC LOOP ENDIF CR CR ;
12 ;S
13
14
15
金城 註疏:
一、在傳統的 FORTH 中 1K(1024 Byte)是連續的 1024 個 Byte ,但
為了撰寫與列表方便,通常都會以 16 列,每列 64 個字為一區
塊。
二、這套資料庫的小程式要改寫成 F-PC 需要花點心血,你可以參考
" F-PC User's Manual " Version 3.5 1989 的
chapter 6 Ssguontial Files ,我相信如果功力夠,大概只要半
天就夠了
三、在此列出幾本資料庫的參考書籍,供有志從是這方面的讀者,自
修閱讀:
(一) An Introduction To DataBase Systen Volume 1 and
Volume 2 fifth Edition C.J. Date 1990 , Addison Wesley
(二) Relational Datadase Writings C.J. Date 1990 ,
Addison Wesley
(三) File Structures Theory and Practice Panos E. Livadas
1990 , Prentice - Hall